/*-- These are header includes --*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socketh.h>
#include<netinet/in.h>

/*-- These are secondary functions --*/
void error (const char* msg){
  perror (msg);
  exit(1);
}

/*-- This is the primary function --*/
int main (int argc, char** argv){
  int sockfd, newsockfd, portno;
  socklen_t clilen;
  char buffer[256];
  struct sockaddr_in serv_addr, cli_add;
  int n;
  
  if(argc<2){
    fprintf(stderr, "!-- ERROR -> no port provided! --!\n");
    exit(1);
  }
  
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if(sockfd<0)
    error("!-- ERROR -> error opening socket --!\n");
  bzero ((char*)&serv_addr, sizeof (serv_addr));
  portno = atoi (argv[1]);
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons (portno);
  
  if(bind (sockfd, (struct sockaddr *)&serv_addr, sizeof (serv_addr))<0)
    error ("!-- ERROR -> Couldn't bind socket --!\n");
    
  listen (sockfd, 5);
  
  clilen = sizeof (cli_addr);
  newsockfd = accept (sockfd, (struct sockaddr *)&cli_addr, &clilen);
  
  if(newsockfd<0)
    error ("!-- ERROR -> error on accept --!\n");
    
  bzero (buffer, 256);
  n = read (newsockfd, buffer, 255);
  if(n<0) error ("!-- ERROR -> reading socket --!\n");
  printf ("%s", buffer);
  close (newsockfd);
  close (sockfd);
  return 0;
}
